﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Entidades.Seguridad;
using MvcPaging;
using Modelo.Seguridad;

namespace VistaOnlineR1._1.Controllers.Seguridad
{
    public class FormulariosController : BaseController
    {
        private const int DefaultPageSize = 10;

        #region campos
        CatalogoFormularios _catalogoFormularios;
        CatalogoPermisos _catalogoPermiso;
        #endregion

        #region Constructors
        public FormulariosController()
            : this(new CatalogoFormularios(), new CatalogoPermisos())
        {
        }

        public FormulariosController(CatalogoFormularios catalogoFormularios, CatalogoPermisos catalogoPermisos)
        {
            _catalogoFormularios = catalogoFormularios;
            _catalogoPermiso = catalogoPermisos;
        }
        #endregion

        public ViewResultBase Search(string text, int? page)
        {

            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Formulario> formularios = _catalogoFormularios.ListarFormularios(text).ToList();

            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

            if (Request.IsAjaxRequest())
                return PartialView("Index", formularios.OrderBy(c => c.IdFormulario).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
            else
                return View("Index", formularios.OrderBy(c => c.IdFormulario).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }


        [Authorize(Roles = "Administracion")]
        public ActionResult Index(int? page)
        {

            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Formulario> formularios = _catalogoFormularios.ListarFormularios().ToList();

            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;
            return View(formularios.OrderBy(c => c.Nombre).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }

       
        [Authorize(Roles = "Administracion")]
        public ActionResult Create()
        {
            Formulario oFormulario = new Formulario();
            
            Int32 max = _catalogoFormularios.GetMayor() + 1;
            oFormulario.IdFormulario = max.ToString();

            ViewBag.Permisos = _catalogoPermiso.ListarPermisos().ToList();

            return View(oFormulario);
        } 
        
        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Create(Entidades.Seguridad.Formulario oFormulario, int[] permisoschecks)
        {
            try
            {
                if (permisoschecks != null)
                {
                    foreach (var permiso in permisoschecks)
                    {
                        Permiso oPermiso = new Permiso();
                        oPermiso = _catalogoPermiso.BuscarPermiso(permiso.ToString());
                        oFormulario.AgregarPermiso(oPermiso);
                    }
                }

                if (_catalogoFormularios.AgregarFormulario(oFormulario))
                {
                    return RedirectToAction("Index");
                    
                }

                ViewBag.Permisos =_catalogoPermiso.ListarPermisos().ToList();

                ModelState.AddModelError("", "El Formulario ingresado ya pertenece al sistema.");
                return View(oFormulario); 
                
            }
            catch
            {
                return View();
            }
        }
        
        [Authorize(Roles = "Administracion")]
        public ActionResult Edit(string IdFormulario)
        {

            Formulario oFormulario = _catalogoFormularios.BuscarFormulario(IdFormulario);

            ViewBag.Permisos = _catalogoPermiso.ListarPermisos().ToList();

            return View(oFormulario);
        }

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Edit(Formulario oFormulario, int[] permisoschecks)
        {
            try
            {
                List<Permiso> lPermiso = new List<Permiso>();
                lPermiso = _catalogoPermiso.ListarPermisos().ToList();
                
                Formulario oFormularioOld = _catalogoFormularios.BuscarFormulario(oFormulario.IdFormulario);

                foreach (var permiso in lPermiso)
                {
                    if (oFormularioOld.Permisos.Any(x => x.IdPermiso == permiso.IdPermiso))
                    {
                        if (!permisoschecks.Any(x => x.ToString() == permiso.IdPermiso))
                        {
                            oFormularioOld.EliminarPermiso(permiso);
                        }
                    }
                    else
                    {
                        if (permisoschecks.Any(x => x.ToString() == permiso.IdPermiso))
                        {
                            oFormularioOld.AgregarPermiso(permiso);
                        }
                    }
                }

                oFormularioOld.Descripcion = oFormulario.Descripcion;
                oFormularioOld.Nombre = oFormulario.Nombre;

                _catalogoFormularios.ModificarFormulario(oFormularioOld);

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
        
        [Authorize(Roles = "Administracion")]
        public ActionResult Delete(string IdFormulario)
        {
            Formulario oFormulario = new Formulario();
            oFormulario = _catalogoFormularios.BuscarFormulario(IdFormulario);

            return View(oFormulario);
        }

        public ActionResult DeleteFormularioError()
        {
            return View();
        }

        [HttpPost]
        [Authorize(Roles = "Administracion")]
        public ActionResult Delete(Formulario oFormulario)
        {
            try
            {
                if (_catalogoFormularios.EliminarFormulario(oFormulario))
                {
                    return RedirectToAction("Index");
                }

                return RedirectToAction("DeleteFormularioError");
                
            }
            catch
            {
                return View();
            }
        }
    }
}
